/**
 * 项目名称:超市会员管理系统
 * 1、创建会员用户类
 *    用户名、密码、会员卡号（随机生成）、注册日期、积分
 * 2.创建超市业务类
 * 菜单展示
 * 业务选择 积分存取方法、积分兑换方法、积分查询方法、修改密码方法、开卡方法
 * 开卡方法：密码长度不能少于6位，否则重新输入密码：
 * 生成一个6六位数的随机会员卡号，要判断卡号是否已经存在，如果随机生成的卡号存在需要重新生成
 * 注册日期:获取当前系统时间，日期格式:2023-09-22 02:06:33
 * 开卡送100积分
 *
 * 修改密码：判断该用户信息是否存在，存在则可以“输入新密码”，否则提示“输入账号信息不匹配，无法进行该业务”
 *
 * 查询剩余积分:判断该用户信息是否存在，存在则输出该会员的信息，否则提示“输入的账号信息不匹配”
 *
 * 积分兑换:判断该用户信息是否存在，存在之后，判断兑换积分是否充足，积分充足就原来的积分减掉要兑换的积分，
 * 积分不足则提示“积分兑换失败，账户积分不足或需要兑换积分大于剩余积分“，用户不存在则提示"账号信息不匹配，无法兑换积分”
 * 积分存取:判断用户信息是否存在，存在则进行积分累加操作，否则提示“积分累计失败，您输入的信息有误"
 *
 * 3.测试类
 *
 * @Author: 夏国倩
 * @Date: 2023/9/22 14:40
 * @Copyright
 */
package itSystemCase4;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
public class Supermarket {
        Scanner sc = new Scanner(System.in);
        Random sr = new Random();
        HashMap<String, User> map = new HashMap<>();
        //开始
        public void Start() {
            while (true) {
                System.out.println("\n--------------------欢迎进入会员管理系统---------------------");
                System.out.println("\n1、积分累计 2、积分兑换 3、查询剩余积分 4、修改密码 5、开卡 6、退出");
                System.out.println("\n----------------------------------------------------------");
                System.out.print("请选择您要进行的操作：");
                int anInt = sc.nextInt(); //接收选择的操作

                switch (anInt) {
                    case 1:
                        //积分累计
                        accumulatedPoints();
                        break;
                    case 2:
                        //积分兑换
                        redemptionPoints();
                        break;
                    case 3:
                        //查询剩余积分
                        queryPoints();
                        break;
                    case 4:
                        //修改密码
                        changePassword();
                        break;
                    case 5:
                        //开卡
                        openBlock();
                        break;
                    case 6:
                        //退出
                        exitSystem();
                        break;
                    default:
                        System.out.println("抱歉，没有该操作！");
                }
            }
        }
        //退出
        public void exitSystem() {
            System.out.println("欢迎下次光临！");
            System.exit(1);
        }
        //修改密码
        public void changePassword() {
            System.out.print("请输入您的会员卡号：");
            String card = sc.next();
            //判断卡号是否存在
            if (map.containsKey(card)) {
                System.out.print("请输入您的密码：");
                String code = sc.next();
                User users = map.get(card);
                if (code.equals(users.getCode())) {
                    //密码一致
                    System.out.print("请输入新密码：");
                    String code1 = sc.next();
                    users.setCode(code1); //把新密码放进users中
                    map.replace(card, users); //更新系统
                    System.out.println("修改密码成功！");
                }
            } else {
                System.out.println("输入的账号信息不匹配!无法进行该业务");
            }
        }
        //查询剩余积分
        public void queryPoints(){
            System.out.print("请输入您的会员卡号：");
            String card=sc.next();
            //判断卡号是否存在
        if (map.containsKey(card)){
            System.out.print("请输入您的密码：");
            String code=sc.next();
            User users=map.get(card);
            if (code.equals(users.getCode())){
                //密码一致
                System.out.println(users.toString(card));
            }else {
                System.out.println("您的密码输入错误！");
            }
        }else {
            System.out.println("输入的账号信息不匹配！");
        }
        }
        //积分兑换
        public void redemptionPoints(){
            System.out.print("请输入您的会员卡号：");
            String card=sc.next();
            //判断卡号是否存在
        if (map.containsKey(card)){
            //存在
            System.out.print("请输入您的密码：");
            String code= sc.next();
            User user=map.get(card); //将卡号对应的数据拿出来
            if (user.getCode().equals(code)){
                //密码一致
                System.out.print("请输入您需要兑换使用的积分（100积分抵用1元，不足100积分不做抵用）：");
                int integral= sc.nextInt();
                if (user.getIntegral()>=100 && integral<=user.getIntegral()){
                    int integral1=user.getIntegral()-integral;
                    user.setIntegral(integral);
                    map.replace(card,user); //更新系统数据
                    System.out.println("您本次的抵用金额为："+integral/100);
                    System.out.println("积分兑换成功！");
                }else {
                    System.out.println("积分兑换失败，账户积分不足或者需要兑换积分大于剩余积分");
                }
            }else {
                System.out.println("您的密码输入错误！");
            }
        }else {
            //不存在
            System.out.println("账户信息不匹配，无法兑换积分");
        }
        }
        //积分累计
        public void accumulatedPoints() {
            System.out.print("请输入您的会员卡号：");
            String card = sc.next();
            //通过卡号来判断集合中是否存在
            //判断卡号是否存在
            if (map.containsKey(card)) {
                //卡号存在
                while (true) {
                    System.out.print("请输入您的密码：");
                    String code1 = sc.next();
                    User user = map.get(card); //将集合里对应卡号的User数据拿出来
                    //判断用户输入的密码和系统里存储的密码是否一致
                    if (code1.equals(user.getCode())) {
                        //密码一致
                        System.out.print("请输入您的消费金额（一元一积分）：");
                        int amount = sc.nextInt();
                        int integral = user.getIntegral() + amount;
                        System.out.println(user.getIntegral());
                        user.setIntegral(integral);
                        map.replace(card, user); //使用replace方法更新集合数据
                        System.out.println("积分增加成功，目前您的积分为：" + integral);
                        System.out.println("积分累加成功！");
                        break;
                    } else {
                        System.out.println("您输入的密码有误！请重新输入");
                    }
                }
            } else {
                //卡号不存在
                System.out.println("您的卡号不存在，请先去开卡~~");
            }
        }
        //开卡
        public void openBlock(){
            System.out.println("-------------开卡操作-------------");
            System.out.print("欢迎使用本超市会员卡，请输入您的名字：");
            String name=sc.next();
            if (name==null){
                System.out.println("您的输入有误，请重新输入！");
            }
            while (true){
                System.out.print("请设置您的密码（密码长度大于6）：");
                String code1=sc.next();
                if (code1.length()>=6){
                    System.out.print("请再次输入，确认您的密码：");
                    String code2=sc.next();
                    if (code1.equals(code2)){
                        System.out.println("密码设置成功！");
                        StringBuilder card=new StringBuilder(); //用来记卡号
                        for (int i=0;i<6;i++){
                            card.append(sr.nextInt(10));
                        }
                        map.put(String.valueOf(card),new User(name,code1,new Date(),100));
                        System.out.println("恭喜您成为本超市会员，系统赠送您100积分，您的会员卡号为："+card+"，请牢记卡号和密码！");
                        break;
                    }else {
                        System.out.println("两次密码输入不一致！");
                    }
                }else {
                    System.out.println("抱歉设置密码失败！密码的长度必须大于等于6");
                }
            }
        }
    }
    class User{
        private String name; //名字
        private String code; //密码
        private Date date; //注册日期
        private int integral=100; //积分

        //重载
        public String toString(String card){
            SimpleDateFormat s1=new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
            return "姓名\t\t"+"会员卡号\t\t"+"积分数\t\t"+"开卡日期"+"\n"+name+"\t\t"+card+"\t\t"+integral+"\t\t"+s1.format(date);
        }
        public User(){
        }

        public User(String name, String code, Date date, int integral) {
            this.name = name;
            this.code = code;
            this.date = date;
            this.integral = integral;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        public Date getDate() {
            return date;
        }

        public void setDate(Date date) {
            this.date = date;
        }

        public int getIntegral() {
            return integral;
        }

        public void setIntegral(int integral) {
            this.integral = integral;
        }
    }

